/**
 * 动态导入修复工具
 * @author Wu.Liang
 * @date 2025-01-30
 * @description 解决Vue Router动态导入模块失败的问题
 */

// 全局状态
let isDynamicImportFixApplied = false

/**
 * 应用动态导入修复
 */
export function applyDynamicImportFix() {
  if (isDynamicImportFixApplied) {
    return
  }

  console.log('应用动态导入修复...')

  // 1. 修复动态导入错误处理
  const originalImport = window.import
  if (originalImport) {
    window.import = function(modulePath: string) {
      return originalImport(modulePath).catch((error: Error) => {
        console.warn('动态导入失败，尝试重新加载:', modulePath, error)
        
        // 如果是Vue组件导入失败，尝试添加时间戳重新加载
        if (modulePath.includes('.vue')) {
          const timestamp = Date.now()
          const newPath = modulePath.includes('?') 
            ? `${modulePath}&t=${timestamp}`
            : `${modulePath}?t=${timestamp}`
          
          return originalImport(newPath).catch((retryError: Error) => {
            console.error('重试动态导入仍然失败:', newPath, retryError)
            throw retryError
          })
        }
        
        throw error
      })
    }
  }

  // 2. 监听动态导入错误
  window.addEventListener('error', (event) => {
    if (event.error && event.error.message && 
        event.error.message.includes('Failed to fetch dynamically imported module')) {
      console.warn('检测到动态导入错误，应用修复...')
      
      // 延迟重新加载页面
      setTimeout(() => {
        console.log('尝试重新加载页面...')
        window.location.reload()
      }, 1000)
    }
  })

  // 3. 监听未处理的Promise拒绝
  window.addEventListener('unhandledrejection', (event) => {
    if (event.reason && event.reason.message && 
        event.reason.message.includes('Failed to fetch dynamically imported module')) {
      console.warn('检测到动态导入Promise错误，应用修复...')
      
      // 延迟重新加载页面
      setTimeout(() => {
        console.log('尝试重新加载页面...')
        window.location.reload()
      }, 1000)
    }
  })

  // 4. 修复Vue Router的动态导入 - Vue 3兼容版本
  // Vue 3中Vue Router的创建方式不同，这里只处理基本的动态导入错误
  // 具体的路由错误处理由Vue Router本身处理

  isDynamicImportFixApplied = true
  console.log('动态导入修复应用完成')
}

/**
 * 安全的动态导入包装器
 */
export function safeDynamicImport(importFn: () => Promise<any>, fallback?: any) {
  return importFn().catch((error: Error) => {
    console.warn('动态导入失败，使用fallback:', error)
    return Promise.resolve(fallback)
  })
}

/**
 * 重试动态导入
 */
export async function retryDynamicImport(
  importFn: () => Promise<any>, 
  maxRetries: number = 3, 
  delay: number = 1000
): Promise<any> {
  let lastError: Error | null = null

  for (let i = 0; i < maxRetries; i++) {
    try {
      return await importFn()
    } catch (error) {
      lastError = error as Error
      console.warn(`动态导入失败，第${i + 1}次重试...`, error)
      
      if (i < maxRetries - 1) {
        await new Promise(resolve => setTimeout(resolve, delay))
      }
    }
  }

  throw lastError || new Error('动态导入重试失败')
}

// Vue 3中不再使用window.VueRouter，动态导入错误由Vue Router本身处理
declare global {
  interface Window {
    import?: (modulePath: string) => Promise<any>
  }
}
